Java no encuentra la clase main

Descripcion

Al compilar un archivo .java no tenemos ningun problema, pero a la hora de ejecutarlo nos encontramos con el siguiente error:

Error: Could not find or load main class JavaApplication1
Caused by: java.lang.NoClassDefFoundError: javaapplication1/JavaApplication1 (wrong name: JavaApplication1)

Dependiendo de como ejecutemos el comando tambien podemos obtener el siguiente error, pero el motivo es el mismo:

Error: Could not find or load main class com.example.HiWorld
Caused by: java.lang.ClassNotFoundException: com.example.HiWorld
Metodo

Este error se produce porque el programa que intentamos ejecutar pertenece a un paquete concreto, si miramos dentro del archivo .java podemos confirmarlo:

Como podemos ver el programa pertenece al paquete javaaplication1. La manera en la que java gestiona esto es a traves de un arbol de subdirectorios, de manera que, el archivo javaaplication1.java tiene que estar dentro de un directorio llamado javaaplication1 y ejecutarlo desde fuera de dicho directorio utilizando toda la ruta, de la siguiente manera:

java javaaplication1.javaaplication1

NOTA: Tambien podemos usar el caracter / como separador en vez del . de manera que asemeje mas a una ruta en si, el siguiente comando funcionaria de igual manera:

java javaaplication1/javaaplication1

Como se puede ver, estamos en el directorio src, dentro de este directorio hay otro directorio que es javaaplication1 y dentro de este directorio tenemos la clase compilada javaaplication1.class

Si el programa no perteneciese a ningun paquete, podria ser ejecutado indicando su nombre sin mas, desde el mismo directorio:

En ese caso el programa test.java no pertenece a nigun paquete, al compilarlo y ejecutarlo podemos ver como funciona correctamente:

Otro ejemplo es cuando la aplicacion pertenece a una ruta de subpaquetes concreta, como en el siguiente caso:

Como se puede ver la aplicacion pertenece al paquete com.mycompany.mavenproject1

En todos estos casos (como se puede ver en la imagen anterior) ya esta creado todo el arbol de subdirectorios, ya que todo esto son proyectos de Netbeans, pero cualquiera persona que vaya a ejecutar directamente desde la consola el programa probablemente acabe cometiendo el error de ir directamente al directorio final cuando la aplicacion pertenece a un paquete

En este ultimo caso deberiamos de ponernos en el directorio java y ejecutar desde ahi el programa

Como podemos ver en la imagen al compilar NewClass desde el directorio final no tenemos ningun problema, pero al ejecutarlo volvemos otra vez con el error de que no se encuentra la clase principal

Al bajar 3 niveles en el arbol de directorios y ponernos en el directorio java y ejecutar el comando con toda la ruta del paquete al que pertenece la aplicacion vemos que se ejecuta correctamente:

java com.mycompany.mavenproject1.NewClass
ClassPath

Para no tener que ponernos en la ruta base de nuestro proyecto y tener que ejecutar desde ahi el comando java podemos usar el classpath (la opcion -cp) y de esta manera le indicamos al interprete de java cual es la ruta base del proyecto

En el siguiente ejemplo tenemos una clase en el paquete com.example y estamos colocados en el directorio donde esta el mismo archivo de la clase:

En este caso podemos ejecutar un comando como el siguiente:

java -cp ..\..\ com.example.HiWorld

En lugar de movernos de directorio, simplemente usamos la opcion -cp para indicar la ruta base del proyecto

Si estuviese en mi directorio personal C:\Users\manuel.bascoy la ejecucion en este caso seria:

java -cp prueba2 com.example.HiWorld

ya que el proyecto esta dentro de la carpeta prueba2

Tags

java | javac | NoClassDefFoundError | main class not found